local args = {}

--将文件外部输入的参数...以空格分割成多个参数
--args = {参数1, 参数2, 参数3, ...}
for word in string.gmatch(..., "%S+") do
	table.insert(args, word)
end

SERVICE_NAME = args[1] --全局变量SERVICE_NAME = 服务文件的名字

local main, pattern

local err = {}
--按字符串LUA_SERVICE给出的多个路径进行检索（以;号分隔）
for pat in string.gmatch(LUA_SERVICE, "([^;]+);*") do
	--以全局变量SERVICE_NAME替换分割字符串中的?得出可能的filename
	local filename = string.gsub(pat, "?", SERVICE_NAME)
	--将filename代指的那个lua文件加载为lua函数
	local f, msg = loadfile(filename)
	--若没找到文件，将错误信息msg放入err
	if not f then
		table.insert(err, msg)
	else
	--若加载成功，暂存被选中的字符子串、加载出的函数
		pattern = pat
		main = f
		break
	end
end

--若按LUA_SERVICE搜寻不到目标文件，打印累计的错误信息
if not main then
	error(table.concat(err, "\n"))
end

--更换全局变量数值
LUA_SERVICE = nil
package.path, LUA_PATH = LUA_PATH
package.cpath, LUA_CPATH = LUA_CPATH

--给全局变量SERVICE_PATH赋值，它的值 = 搜寻到的lua服务文件的路径
local service_path = string.match(pattern, "(.*/)[^/?]+$")
if service_path then
	service_path = string.gsub(service_path, "?", args[1])
	package.path = service_path .. "?.lua;" .. package.path --给package.path的前面加一段当前正在启动的服务在用的(相对)路径
	SERVICE_PATH = service_path
else
	local p = string.match(pattern, "(.*/).+$")
	SERVICE_PATH = p
end

--以args为参数去执行LUA_PRELOAD指定的文件
if LUA_PRELOAD then
	local f = assert(loadfile(LUA_PRELOAD))
	f(table.unpack(args))
	LUA_PRELOAD = nil
end

--以"./lualib/skynet/require.lua"当中的require函数替换lua语言全局的require，你可以姑且当它等同于_G.require先
_G.require = (require "skynet.require").require

--排除args[1], 将args的剩余元素展开，作为参数执行目标lua服务文件的内容
main(select(2, table.unpack(args)))